﻿#ifndef COMPLEXE_H
#define COMPLEXE_H
/**
 \file complexe.h
 \brief Gestion des complexes
 \author Baptiste Pirault et  Hugo Dubois
 \date 01/06/2012
 \version 1
 **/
#include <QString>
#include <complex>
#include "fonctions.h"

/*!
 \class Complexe
 \brief La classe gére l'affichage des complexes
 */
class complexe : public std::complex<double>
{
public:
    //! \brief Constructeur
    //!
    //! Utilise la classe existante complexe.\n Initialise la partie réel et la partie imaginaire avec a et b
    //! \param a : 0 par défaut
    //! \param b : 0 par défaut
    complexe(const double a = 0,const double b = 0) : std::complex<double>(a,b) {
        p_re = len(a);
        p_im = len(b);
    }

    //! \brief Constructeur
    //!
    //! Utilise la classe existante complexe.\n Initialise la partie réel et la partie imaginaire avec un autre complexe
    //! \param x : Complexe de type double
    complexe(const std::complex<double> x):std::complex<double>(x){
        p_re = len(x.real());
        p_im = len(x.imag());
    }

    //! \brief Constructeur : s doit etre de la forme a$b
    //!
    //! \param s : QString
    complexe(const QString & s);

    //! \brief Retourne le complexe X en QString
    //!
    //! \return Retourne un QString contenant le complexe. Mis en forme pour l'affichage (avec le $)
    QString& toQString() const;

    //! \brief Mutateur de la partie réel
    //!
    //! \param a : double pour la partie réel
    void setReal(const double a);


    //! \brief Mutateur de la partie imaginaire
    //!
    //! \param b : double pour la partie imaginaire
    void setImag(const double b);

    //! \brief Mutateur de p_re
    //!
    //! Affecte la valeur de p à p_re
    //! \param p : entier pour la précision de partie réelle
    void setP_Re(const int p);

    //! \brief Mutateur de p_im
    //!
    //! Affecte la valeur de p à p_im
    //! \param p : entier pour la précision de partie imaginaire
    void setP_Im(const int p);

    //! \brief Test si le complexe est null
    //! \return true si le complexe est null
    //! \return false si le complexe est non null
    bool isNull() const;
private:
    //! \brief Entier représentant la précision du la partie réelle
    //! La précision est le nombre de chiffre qui compose la partie réel
    //! Utile pour l'affichage du complexe
    int p_re;

    //! \brief Entier représentant la précision du la partie imaginaire
    //! La précision est le nombre de chiffre qui compose la partie imaginaire
    //! Utile pour l'affichage du complexe
    int p_im;
};
QString toQString(const complexe x);

#endif // COMPLEXE_H
